home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / HENSA / MISC / SHELL.ARC / Shell / Sources / c / SpriteRect < prev    next >
Text File  |  1994-10-26  |  4KB  |  176 lines

  1. #include "DeskLib:Sprite.h"
  2. #include "DeskLib:SWI.h"
  3. #include "DeskLib:GFX.h"
  4. #include "DeskLib:Screen.h"
  5. #include "DeskLib:WimpSWIs.h"
  6.  
  7. #include "Shell.SafeAlloc.h"
  8. #include "Shell.Printf.h"
  9. #include "Shell.Shell.h"
  10.  
  11. #include "Shell.SpriteRect.h"
  12.  
  13.  
  14.  
  15.  
  16. const Shell_convertpoint    Shell_nullconvert = { 0, 0};
  17.  
  18. typedef struct    {
  19.     sprite_areainfo    *areainfo;
  20.     union    {
  21.         sprite_header    *header;
  22.         char        *name;
  23.         }
  24.         sprite;
  25.     }
  26.     Shell_spriteblock;
  27.  
  28.  
  29.  
  30.  
  31.  
  32. static sprite_outputstate    oldstate;
  33. static void            *savebuffer;
  34.  
  35.  
  36.  
  37.  
  38.  
  39. void Shell_RedirectToSprite( Shell_rectblock *rectblock)
  40. {
  41. Shell_spriteblock    *spriteblock = (Shell_spriteblock *) rectblock->reference;
  42. int            savesize;
  43.  
  44. /* Find size of savebuffer.    */
  45.  
  46. SWI(    3, 4, SWI_OS_SpriteOp,
  47.     256+62, spriteblock->areainfo, spriteblock->sprite.name,
  48.     NULL, NULL, NULL, &savesize
  49.     );
  50.  
  51. savebuffer = Shell_SafeCalloc( 1, savesize);
  52.     /* Must be calloc, otherwise 'invalid save area' is returned by Sprite_Redirect.    */
  53.     /* presumably because the alloc-ed block is set to 0 by calloc...            */
  54.  
  55. Sprite_Redirect( (sprite_area) spriteblock->areainfo, spriteblock->sprite.name, savebuffer, &oldstate);
  56.  
  57. return;
  58. }
  59.  
  60.  
  61.  
  62. void Shell_UnRedirect( void)
  63. {
  64. Sprite_UnRedirect( &oldstate);
  65. free( savebuffer);
  66. return;
  67. }
  68.  
  69.  
  70.  
  71.  
  72. static void Shell__SpriteRedrawer(
  73.     Shell_convertpoint    convert,
  74.     wimp_point        rectsize,
  75.     void            *reference,
  76.     const wimp_rect        *redrawrect
  77.     )
  78. {
  79. Shell_spriteblock    *spriteblock = (Shell_spriteblock *) reference;
  80. UNUSED( redrawrect);
  81. UNUSED( rectsize);
  82. Sprite_Plot( spriteblock->areainfo, spriteblock->sprite.name, convert.x, convert.y, plot_SOLIDBOTH);
  83. return;
  84. }
  85.  
  86.  
  87.  
  88.  
  89.  
  90. static BOOL Shell__SpriteRectSaver( char *filename, Shell_rectblock *r)
  91. {
  92. Shell_spriteblock    *spriteblock = (Shell_spriteblock *) r->reference;
  93. Error_Check( Sprite_Save( (sprite_area) spriteblock->areainfo, filename));
  94.  
  95. return TRUE;
  96. }
  97.  
  98.  
  99. #define Min( a, b) ( (a) < (b) ) ? (a) : (b)
  100.  
  101. static int    Shell__SpriteRectRamSaver(
  102.     task_handle        sourcetask,
  103.     Shell_rectblockptr    r,
  104.     task_handle        desttask,
  105.     void            *destbuffer,
  106.     unsigned int        buffersize,
  107.     int            progress
  108.     )
  109. {
  110. Shell_spriteblock    *spriteblock    = (Shell_spriteblock *) r->reference;
  111. char            *data        = ((char *) spriteblock->areainfo) + 4;
  112. int            n;
  113.  
  114. /* Find number of bytes to transfer    */
  115. n = Min( spriteblock->areainfo->areasize-4/*first word isn't saved*/-progress, buffersize);
  116.  
  117. Wimp_TransferBlock(
  118.     sourcetask, data + progress,
  119.     desttask, destbuffer,
  120.     n
  121.     );
  122. return n;
  123. }
  124.  
  125.  
  126.  
  127. #define DEFAULT_NAME "NoName"
  128.  
  129.  
  130. Shell_rectblock *Shell_AddSpriteRect(
  131.     Shell_windblock    *wind,
  132.     int        x,
  133.     int        y,
  134.     int        xsize,
  135.     int        ysize
  136.     )
  137. {
  138. int            areasize;
  139. sprite_areainfo        *areainfo;
  140. Shell_spriteblock    *spriteblock;
  141. Shell_rectblock        *r;
  142. wimp_point        pixelsize;
  143.  
  144. Screen_CacheModeInfo();
  145. pixelsize.x = xsize >> screen_eig.x;
  146. pixelsize.y = xsize >> screen_eig.y;
  147.  
  148. areasize = sizeof( sprite_areainfo) + Sprite_MemorySize( pixelsize.x, pixelsize.y, screen_mode, sprite_HASNOMASKPAL);
  149. areainfo = (sprite_areainfo *) Shell_SafeMalloc( areasize);
  150.  
  151. spriteblock = (Shell_spriteblock *) Shell_SafeMalloc( sizeof( Shell_spriteblock));
  152. spriteblock->areainfo        = areainfo;
  153. spriteblock->sprite.name    = DEFAULT_NAME;
  154.  
  155. areainfo->areasize    = areasize;
  156. areainfo->numsprites    = 0;
  157. areainfo->firstoffset    = 16;
  158. areainfo->freeoffset    = 16;
  159. Sprite_InitArea( (sprite_area) areainfo);
  160.  
  161. Sprite_Create( (sprite_area) areainfo, DEFAULT_NAME, 0/*no palette*/, pixelsize.x, pixelsize.y, screen_mode);
  162.  
  163. r = Shell_AddRectangle3( wind, x, y, xsize, ysize, Shell__SpriteRedrawer, spriteblock);
  164. Shell_MakeRectIcon( r, colour_BLACK, colour_WHITE, "r1");
  165. r->saver    = Shell__SpriteRectSaver;
  166. r->ramsaver    = Shell__SpriteRectRamSaver;
  167. r->filetype    = 0xff9;
  168. r->size        = areasize - 4;
  169.  
  170. return r;
  171.  
  172. }
  173.  
  174.  
  175.  
  176.